package modelo;

import modelo.MdFicha;


import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
import javax.swing.Timer;

import java.io.Serializable;

public class MdJuego extends javax.swing.JPanel  {
	

	int totalMinas=0;
	int totalMinasAlto = 0;
	int totalMinasAncho = 0;
	private int casillas;
	MdFicha[][] campoMinado = null;
	int maximoCuadro = 50;
	boolean inicio = true;
	Timer timer;
	int tiempo;
	String jug;
	
    public String getJug() {
		return jug;
	}

	public void setJug(String jug) {
		this.jug = jug;
	}

	private void avanzaTiempo()
    {
           timer = new Timer (1000, new ActionListener ()
            {
                public void actionPerformed(ActionEvent e)
                {
                	tiempo++;            
                }
                
            });
           
            
       timer.start();
    }

	public MdJuego(int totalMinasAlto , int totalMinasAncho, int totalMinas) {
		super();
		this.totalMinas = totalMinas;
		this.totalMinasAlto = totalMinasAlto;
		this.totalMinasAncho = totalMinasAncho;
		
	}
	public MdJuego() {
		super();
	}
	public MdJuego(boolean arg0) {
		super(arg0);
	}
	public MdJuego(LayoutManager arg0, boolean arg1) {
		super(arg0, arg1);
	}
	public MdJuego(LayoutManager arg0) {
		super(arg0);
	}
	public void settotalMinas(int totalMinas) {
		this.totalMinas = totalMinas;
	}
	public int gettotalMinasAlto() {
		return totalMinasAlto;
	}
	public void settotalMinasAlto(int totalMinasAlto) {
		this.totalMinasAlto = totalMinasAlto;
	}
	public int gettotalMinasAncho() {
		return totalMinasAncho;
	}
	public void settotalMinasAncho(int totalMinasAncho) {
		this.totalMinasAncho = totalMinasAncho;
	}
	public int getCasillas() {
		return casillas;
	}
	public void setCasillas(int casillas) {
		this.casillas = casillas;
	}
	public int getmaximoCuadro() {
		return maximoCuadro;
	}
	public void setmaximoCuadro(int maximoCuadro) {
		this.maximoCuadro = maximoCuadro;
	}
	public boolean isInicio() {
		return inicio;
	}
	public void setInicio(boolean inicio) {
		this.inicio = inicio;
	}
	
	final public void cargarcampoMinado() {
        inicio = true;
        this.campoMinado = generarcampoMinado(totalMinasAlto, totalMinasAncho, totalMinas);
        this.removeAll();
        this.setLayout(new GridLayout(totalMinasAlto, totalMinasAncho));
       
        for (int i = 0; i < campoMinado.length; i++) {
            for (int j = 0; j < campoMinado[i].length; j++) {
                this.add(campoMinado[i][j]);
                campoMinado[i][j].addMouseListener(btnMouseLister); 
            }
        }
        this.setSize(maximoCuadro * totalMinasAncho, maximoCuadro * totalMinasAlto);
        updateUI();
        avanzaTiempo();
        tiempo=0;
    }
	int cuantasQuedan()
	{

		int q=0;
        for (int i = 0; i < campoMinado.length; i++) {
            for (int j = 0; j < campoMinado[i].length; j++) {
            	if(campoMinado[i][j].isEnabled())
            		q++;
            }
        }
            

		return q;
	}
        
    private final MouseListener btnMouseLister = new MouseAdapter() {

        @Override
        public void mouseReleased(MouseEvent e) {
            abrir((MdFicha) e.getSource(), e.getButton());
        }
    };

    private static MdFicha[][] generarcampoMinado(int totalCasillasAlto, int totalCasillasAncho, int totalMinas)
    {
        MdFicha[][] campoMinado = new MdFicha[totalCasillasAlto][totalCasillasAncho];
        for (int i = 0; i < totalMinas; i++) {
            int alto = (int) Math.round(Math.random() * (totalCasillasAlto - 1)), ancho = (int) Math.round(Math.random() * (totalCasillasAncho - 1));
            if (campoMinado[alto][ancho] == null) {
                campoMinado[alto][ancho] = new MdFicha(-1);
            } else {
                i--;
            }
        }
        for (int i = 0; i < campoMinado.length; i++) {
            for (int j = 0; j < campoMinado[i].length; j++) {
                if (campoMinado[i][j] == null) {
                    int c = 0;
                    for (int k = -1; k <= 1; k++) {
                        for (int l = -1; l <= 1; l++) {
                            try {
                                if (campoMinado[i - k][j - l].getValue() == -1) {
                                    c++;
                                }
                            } catch (Exception e) {
                            }
                        }
                    }
                    campoMinado[i][j] = new MdFicha(c);
                }
            }
        }
        return campoMinado;
    }
    private void abrir(MdFicha b, int button) {
        if (!b.isEnabled()) {
            return;
        }
        if (b.mostrar() == -1) {
            if (inicio) {
                for (int i = 0; i < 10; i++) {
                    for (int j = 0; j < campoMinado.length; j++) {
                        if (campoMinado[i][j].equals(b)) {
                            cargarcampoMinado();                          
                            abrir(campoMinado[i][j], button);
                            return;
                        }
                    }
                }
            }
            mostrarValores();
            JOptionPane.showMessageDialog(null, "Perdiste");
        } else {
            if (b.getValue() == 0) {
                mostrarAlrededor(b);
                if (cuantasQuedan()==totalMinas)
                {
                	JOptionPane.showMessageDialog(null, "ganaste");
                	String n="";
                	if (totalMinas==10) n="Principiante";
                	if (totalMinas==40) n="Intermedio";
                	if (totalMinas==100) n="Avanzado";
                	new Conexion().ejecutar("insert into score (jugador,puntaje,nivel) values('" + jug + "',"+ tiempo +",'"+n +"') ");
                	
                }

            }
        }
        if (button == MouseEvent.BUTTON3) {
            b.Marcar();
            return;
        }
        
        inicio = false;
    }
    private void mostrarValores() {
        for (int i = 0; i < campoMinado.length; i++) {
            for (int j = 0; j < campoMinado[i].length; j++) {
                campoMinado[i][j].mostrar();
            }
        }
    }

    private void mostrarAlrededor(MdFicha b) {
        Toolkit.getDefaultToolkit().beep(); 
        b.mostrar();
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < campoMinado.length; j++) {
                if (campoMinado[i][j].equals(b)) {
                    for (int k = -1; k <= 1; k++) {
                        for (int l = -1; l <= 1; l++) {
                            try {
                                MdFicha t=campoMinado[i - k][j - l];
                                if (t.getValue() == 0) {
                                    if (t.isEnabled()) {
                                        mostrarAlrededor(t);
                                    }
                                }else{
                                    t.mostrar();
                                }
                            } catch (Exception e) {
                            }
                        }
                    }
                }
            }
        }

    }

	public MdJuego(int totalMinas, int totalMinasAlto, int totalMinasAncho,
			int casillas, MdFicha[][] campoMinado, int maximoCuadro,
			boolean inicio) {
		super();
		this.totalMinas = totalMinas;
		this.totalMinasAlto = totalMinasAlto;
		this.totalMinasAncho = totalMinasAncho;
		this.casillas = casillas;
		this.campoMinado = campoMinado;
		this.maximoCuadro = maximoCuadro;
		this.inicio = inicio;
	}
	
	public int gettotalMinas() {
		return totalMinas;
	}

   
}
